package com.cloudboy.redisConsole.jedis;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

@Component
public class MyJedisPool {
	@Value("${spring.redis.host}")
	private String host;

	@Value("${spring.redis.port}")
	private int port;

	@Value("${spring.redis.timeout}")
	private int timeout;

	@Value("${spring.redis.pool.max-idle}")
	private int maxIdle;
	
	@Value("${spring.redis.pool.min-idle}")
	private int minIdle;

	@Value("${spring.redis.pool.max-active}")
	private int maxActive;

	@Value("${spring.redis.pool.max-wait}")
	private int maxWait;

	@Value("${spring.redis.password}")
	private String password;

	private static JedisPool jedisPool = null;

	public Jedis getJedis() {
		if (jedisPool == null) {
			JedisPoolConfig config = new JedisPoolConfig();
			// 配置最大jedis实例数
			config.setMaxTotal(maxActive);
			// 配置资源池最大闲置数
			config.setMaxIdle(maxIdle);
			// 配置资源池最小闲置数
			config.setMinIdle(minIdle);
			// 等待可用连接的最大时间
			config.setMaxWaitMillis(maxWait);
			// 在borrow一个jedis实例时，是否提前进行validate操作；如果为true，则得到的jedis实例均是可用的
			config.setTestOnBorrow(true);
			config.setTestOnReturn(true);
			//Idle时进行连接扫描
			config.setTestWhileIdle(true);
			//表示idle object evitor两次扫描之间要sleep的毫秒数
			config.setTimeBetweenEvictionRunsMillis(30000);
			//表示idle object evitor每次扫描的最多的对象数
			config.setNumTestsPerEvictionRun(10);
			//表示一个对象至少停留在idle状态的最短时间，然后才能被idle object evitor扫描并驱逐；这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义
			config.setMinEvictableIdleTimeMillis(60000);
			
			jedisPool = new JedisPool(config, host, port, timeout, password);
		}
		return jedisPool.getResource();
	}	
}
